package string;
//你在与一位习惯从右往左阅读的朋友发消息，他发出的文字顺序都与正常相反但单词内容正确，为了和他顺利交流你决定写一个转换程序，把他所发的消息 message 转换为正常语序。
//
//注意：输入字符串 message 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。
public class 字符串中的单词反转 {
    //双指针
    class Solution {
        public String reverseMessage(String message) {
            message = message.trim();                               // 删除首尾空格
            int j = message.length() - 1, i = j;
            StringBuilder res = new StringBuilder();
            while (i >= 0) {
                while (i >= 0 && message.charAt(i) != ' ') i--;     // 搜索首个空格
                res.append(message.substring(i + 1, j + 1) + " ");  // 添加单词
                //String substring(int beginIndex)
                //String substring(int beginIndex, int endIndex)
                // beginIndex：子字符串的起始索引（包括此位置的字符）。
                // endIndex：子字符串的结束索引（不包括此位置的字符）。
                while (i >= 0 && message.charAt(i) == ' ') i--;     // 跳过单词间空格
                j = i;                                              // j 指向下个单词的尾字符
            }
            return res.toString().trim();                           // 转化为字符串并返回
        }
    }

    //分割 + 倒序
    class Solution2 {
        public String reverseMessage(String message) {
            String[] str = message.trim().split(" ");
            //split 方法是 Java 中 String 类的一个非常实用的方法，用于将字符串分割成一个字符串数组。
            // 它可以根据提供的正则表达式将原字符串切割成多个部分。
            StringBuilder res = new StringBuilder();
            for(int i=str.length-1;i>=0;i--){
                 if(str[i].equals(""))
                     continue;
                 res.append(str[i]+' ');
            }
            return res.toString().trim();

        }
    }
}
